package com.zhijiang.hospital.service.impl;

import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.zhijiang.hospital.entity.dto.AisOperRegDto;
import com.zhijiang.hospital.entity.vo.AisOperRegVo;
import com.zhijiang.hospital.mapper.AisOperRegDtoMapper;
import com.zhijiang.hospital.mapper.ComDepartmentMapper;
import com.zhijiang.hospital.service.AisOperRegDtoService;
import com.zhijiang.util.BaseQuery;
import com.zhijiang.util.NumberUtils;
import com.zhijiang.util.PageList;
import com.zhijiang.util.TimeUtil;
import com.zhijiang.util.redis.RedisService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import java.util.stream.Collectors;

/**
 * @author 75936
 * @version 1.0
 * @project zhijiang_hospital_data
 * @description
 * @date 2023-02-13 16:29:33
 */
@Service
public class AisOperRegDtoServiceImpl implements AisOperRegDtoService {
    @Autowired
    AisOperRegDtoMapper aisOperRegDtoMapper;
    @Autowired
    ComDepartmentMapper comDepartmentMapper;
    @Autowired
    RedisService redisService;

    private static final String NUMMBER = "192.168.3.250:8081";

    @Override
    public List<AisOperRegDto> findAisOperRegDto(String startTime, String endTime) {
        List<AisOperRegDto> aisOperRegDto = aisOperRegDtoMapper.findAisOperRegDto(startTime, endTime);
        List<AisOperRegDto> allByDept = comDepartmentMapper.findAllByDept();
        for (AisOperRegDto operRegDto : aisOperRegDto) {
            if (operRegDto.getOperationNumber() == null) {
                operRegDto.setOperationNumber("0");
            }
            for (AisOperRegDto regDto : allByDept) {
                if (regDto.getPatientArea().equals(operRegDto.getPatientArea())) {
                    operRegDto.setDeptCode(regDto.getDeptCode());
                }
            }
        }
        return aisOperRegDto;
    }

    @Override
    public Map<String, Object> findAisOperRegDtos(BaseQuery baseQuery) {
        List<AisOperRegDto> aisOperRegDtos = aisOperRegDtoMapper.findAisOperRegDto(baseQuery.getStartTime(), baseQuery.getEndTime());
        List<AisOperRegDto> allByDept = comDepartmentMapper.findAllByDept();
        for (AisOperRegDto operRegDto : aisOperRegDtos) {
            if (operRegDto.getOperationNumber() == null) {
                operRegDto.setOperationNumber("0");
            }
            for (AisOperRegDto regDto : allByDept) {
                if (regDto.getPatientArea().equals(operRegDto.getPatientArea())) {
                    operRegDto.setDeptCode(regDto.getDeptCode());
                }
            }
        }
        List<String> collect1 = aisOperRegDtos.stream().map(AisOperRegDto::getOperationNum).collect(Collectors.toList());
        int sum1 = collect1.stream().mapToInt(Integer::parseInt).sum();
        List<String> collect2 = aisOperRegDtos.stream().map(AisOperRegDto::getOperationNumber).collect(Collectors.toList());
        int sum2 = collect2.stream().mapToInt(Integer::parseInt).sum();
        AisOperRegDto aisOperRegDto = new AisOperRegDto();
        aisOperRegDto.setOperationNumber(String.valueOf(sum2));
        aisOperRegDto.setOperationNum(String.valueOf(sum1));
        aisOperRegDto.setPatientArea("合计");
        List<AisOperRegDto> list1 = new ArrayList<>();
        list1.add(aisOperRegDto);
        Map<String, Object> map = new HashMap<>();
        //PageHelper.startPage(baseQuery.getPage(), baseQuery.getPageSize());
        //PageInfo<AisOperRegDto> pageInfo = new PageInfo<>(aisOperRegDtos);
        //Integer pageSize = NumberUtils.drawSurplus(pageInfo.getTotal(), baseQuery.getPageSize());
        //Integer pages = NumberUtils.totalPages(pageInfo.getTotal(), baseQuery.getPageSize());
        //PageList<AisOperRegDto> aisOperRegDtoPageList = new PageList<>(pageInfo.getTotal(), pageInfo.getList(), baseQuery.getPage(), pageSize, pages);
        //map.put("jihe", aisOperRegDtoPageList);
        map.put("heji", list1);
        return map;
    }

    @Override
    public PageList<AisOperRegDto> findAisOperRegDtosByPageList(BaseQuery baseQuery) {
        PageHelper.startPage(baseQuery.getPage(), baseQuery.getPageSize());
        List<AisOperRegDto> aisOperRegDtos = aisOperRegDtoMapper.findAisOperRegDto(baseQuery.getStartTime(), baseQuery.getEndTime());
        List<AisOperRegDto> allByDept = comDepartmentMapper.findAllByDept();
        for (AisOperRegDto operRegDto : aisOperRegDtos) {
            if (operRegDto.getOperationNumber() == null) {
                operRegDto.setOperationNumber("0");
            }
            for (AisOperRegDto regDto : allByDept) {
                if (regDto.getPatientArea().equals(operRegDto.getPatientArea())) {
                    operRegDto.setDeptCode(regDto.getDeptCode());
                }
            }
        }
        PageInfo<AisOperRegDto> pageInfo = new PageInfo<>(aisOperRegDtos);
        Integer pageSize = NumberUtils.drawSurplus(pageInfo.getTotal(), baseQuery.getPageSize());
        Integer pages = NumberUtils.totalPages(pageInfo.getTotal(), baseQuery.getPageSize());
        PageList<AisOperRegDto> aisOperRegDtoPageList = new PageList<>(pageInfo.getTotal(), pageInfo.getList(), baseQuery.getPage(), pageSize, pages);
        return aisOperRegDtoPageList;
    }

    @Override
    public List<AisOperRegDto> findYearData() {
        DateTime dateTime = DateUtil.beginOfYear(new Date());
        String year = String.valueOf(DateUtil.year(dateTime));
        DateTime dateTime1 = DateUtil.endOfYear(new Date());
        String startTime = Convert.toStr(dateTime);
        String endTime = Convert.toStr(dateTime1);
        if (redisService.hasKey(year + "LoadLastYearAisOperRegDto")) {
            return redisService.getKeyObjectValue(year + "LoadLastYearAisOperRegDto", List.class);
        }
        List<AisOperRegDto> aisOperRegDto = aisOperRegDtoMapper.findYearData(startTime, endTime);
        List<AisOperRegDto> allByDept = comDepartmentMapper.findAllByDept();
        for (AisOperRegDto operRegDto : aisOperRegDto) {
            if (operRegDto.getOperationNumber() == null) {
                operRegDto.setOperationNumber("0");
            }
            for (AisOperRegDto regDto : allByDept) {
                if (regDto.getPatientArea().equals(operRegDto.getPatientArea())) {
                    operRegDto.setDeptCode(regDto.getDeptCode());
                }
            }
        }
        redisService.setStringKeyAndValue(year + "LoadLastYearAisOperRegDto", aisOperRegDto, 60);
        return aisOperRegDto;

    }

    @Override
    public List<AisOperRegDto> findLastYearData() {
        Date nextYearPreDay = TimeUtil.getNextYearPreDay();
        DateTime dateTime3 = DateUtil.beginOfYear(nextYearPreDay);
        String lastYear = String.valueOf(DateUtil.year(dateTime3));
        DateTime dateTime4 = DateUtil.endOfYear(nextYearPreDay);
        String format = TimeUtil.format(dateTime3);
        String format1 = TimeUtil.format(dateTime4);
        if (redisService.hasKey(lastYear + "findLastYearDataAisOperRegDto")) {
            return redisService.getKeyObjectValue(lastYear + "findLastYearDataAisOperRegDto", List.class);
        }
        List<AisOperRegDto> yearData = aisOperRegDtoMapper.findYearData(format, format1);
        List<AisOperRegDto> allByDept = comDepartmentMapper.findAllByDept();
        for (AisOperRegDto operRegDto : yearData) {
            if (operRegDto.getOperationNumber() == null) {
                operRegDto.setOperationNumber("0");
            }
            for (AisOperRegDto regDto : allByDept) {
                if (regDto.getPatientArea().equals(operRegDto.getPatientArea())) {
                    operRegDto.setDeptCode(regDto.getDeptCode());
                }
            }
        }
        redisService.setStringKeyAndValue(lastYear + "findLastYearDataAisOperRegDto", yearData, 60);
        return yearData;
    }


    public List<AisOperRegVo> findLastYearDataDay(Long day) {
        ArrayList<AisOperRegVo> list = new ArrayList<>();
        for (int i = 0; i <= day; day--) {
            List<AisOperRegVo> yearDataDay = aisOperRegDtoMapper.findYearDataDay(day);
            for (AisOperRegVo aisOperRegVo : yearDataDay) {
                aisOperRegVo.setOperBeginTime(DateUtil.format(DateUtil.parse(aisOperRegVo.getOperBeginTime()), "yyyy-MM-dd"));
                list.add(aisOperRegVo);
            }
        }
        List<AisOperRegVo> collect1 = null;
        Map<String, Map<String, List<AisOperRegVo>>> collect = list.stream().collect(Collectors.groupingBy(AisOperRegVo::getOperBeginTime, Collectors.groupingBy(AisOperRegVo::getPatientArea)));
        Set<String> keySet = collect.keySet();
        ArrayList<AisOperRegVo> objects = new ArrayList<>();
        for (String key : keySet) {
            Map<String, List<AisOperRegVo>> stringListMap = collect.get(key);
            Set<String> stringSet = stringListMap.keySet();
            for (String mapKey : stringSet) {
                List<AisOperRegVo> aisOperRegVos = stringListMap.get(mapKey);
                ArrayList<AisOperRegVo> arrayList = new ArrayList<>();
                for (AisOperRegVo aisOperRegVo : aisOperRegVos) {
                    if (mapKey == aisOperRegVo.getPatientArea()) {
                        if (StrUtil.isNotEmpty(aisOperRegVo.getOperLevelId()) && aisOperRegVo.getOperLevelId().equals("四级")) {
                            arrayList.add(aisOperRegVo);
                            aisOperRegVo.setOperationNumber(String.valueOf(arrayList.size()));
                        }
                        aisOperRegVo.setOperationNum(String.valueOf(aisOperRegVos.size() - arrayList.size()));
                    }
                }
                TreeSet<AisOperRegVo> aisOperRegVos1 = new TreeSet<>(Comparator.comparing(s -> s.getPatientArea()));
                collect1 = aisOperRegVos.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(s -> s.getPatientArea()))), ArrayList::new));
                objects.addAll(collect1);
            }
        }
        return objects;
    }

    @Override
    public Object getAisOperRegData(String startTime, String endTime) {
        List<String> patientAreaList = new ArrayList<>();
        List<String> operationNumList = new ArrayList<>();
        List<String> operationNumberList = new ArrayList<>();
        Map<String, List> map = new HashMap<>();
        List<AisOperRegDto> eChartDataList = aisOperRegDtoMapper.findAisOperRegDto(startTime, endTime);
        for (int i = 0; i < eChartDataList.size(); i++) {
            patientAreaList.add(eChartDataList.get(i).getPatientArea());
            operationNumList.add(eChartDataList.get(i).getOperationNum());
            operationNumberList.add(eChartDataList.get(i).getOperationNumber());
        }
        map.put("patientAreaList", patientAreaList);
        map.put("operationNumList", operationNumList);
        map.put("operationNumberList", operationNumberList);
        return map;
    }

    public List getChartData(Long day) {
        List<AisOperRegVo> list = aisOperRegDtoMapper.findYearDataDay(day);
        Map<String, List<AisOperRegVo>> collect = list.stream().collect(Collectors.groupingBy(AisOperRegVo::getPatientArea));

        //Map<String, List<AisOperRegVo>> collect = list.stream().collect(Collectors.groupingBy(AisOperRegVo::getOperBeginTime));
        List<AisOperRegVo> fourList = aisOperRegDtoMapper.getOperationData(day);
        Map<String, List<AisOperRegVo>> fourCollect = fourList.stream().collect(Collectors.groupingBy(AisOperRegVo::getPatientArea));
        Set<String> fourSet = fourCollect.keySet();
        Set<String> keySet = collect.keySet();
        for (String key : fourSet) {
            List<AisOperRegVo> list1 = collect.get(key);
        }
        //for (String key : strings) {
        //    List<AisOperRegVo> aisOperRegVos = fourCollect.get(key);
        //    Map<String, List<AisOperRegVo>> collect1 = aisOperRegVos.stream().collect(Collectors.groupingBy(AisOperRegVo::getPatientArea));
        //    List<AisOperRegVo> aisOperRegVos1 = collect1.get(key);
        //}
        //Set<String> keySet = collect.keySet();
        //for (String key : keySet) {
        //    List<AisOperRegVo> aisOperRegVos = collect.get(key);
        //}

        return list;
    }

}
